#!/usr/bin/python
# -*- coding: UTF-8 -*-

from kpautos.engine.case import Case
from kptest.config.enum import DeviceType, HostType, DeviceUtility
import re
import time


class BMC_SSH_008(Case):
    """
        Name:
            BMC_SSH_008
        Label:
            服务器上下电功能测试
        PreCondition:
            1、BMC正常运行
        TestStep:
            1.登录BMC
            2.查看当前电源状态,确保服务器开机
            iBMC:/->ipmcget -d powerstate
            3.强制下电，查看服务器状态，有结果A）
            iBMC:/->ipmcset -d powerstate -v 2
            4.上电，查看服务器状态，有结果B）
            iBMC:/->ipmcset -d powerstate -v 1
            5.正常下电，查看服务器状态，有结果A）
            iBMC:/->ipmcset -d powerstate -v 0
            6. 服务器上电
        ExpectedResult:
            A）服务器状态为下电
            B）服务器状态为上电
        Parameters:

        Remark:

    """

    # 测试执行前配置等准备操作
    def pre_test_case(self):
        self.device_dut = self.resource.get_device(device_type=DeviceType.Server, utility=DeviceUtility.DUT)
        self.cli_api = self.device_dut.get_api(ns_name="BmcCli")

    # 测试步骤
    def procedure(self):
        self.log_step("1、查看当前电源状态,确保服务器开机")
        power_state = self.cli_api.cli_get_power_state()
        if power_state == None:
            raise Exception("查看电源状态失败")
        if not re.search('On', power_state[0], re.I):
            raise Exception("当前电源状态为关机状态，请确保服务器开机")
        else:
            self.log_info("服务器为开机状态")

        try_times = 30
        self.log_step("2、强制下电，查看服务器状态")
        force_poweroff = self.cli_api.cli_set_power_state('2')
        if force_poweroff == None:
            raise Exception("强制下电命令执行失败")
        for _ in range(try_times):
            power_state = self.cli_api.cli_get_power_state()
            if re.search('Off', power_state[0], re.I):
                self.log_info("服务器已关机")
                break
        else:
            raise Exception("当前电源状态不为关机状态，强制下电失败")

        self.log_step("3、正常上电，查看服务器状态")
        poweron = self.cli_api.cli_set_power_state('1')
        if poweron == None:
            raise Exception("正常上电命令执行失败")
        for _ in range(try_times):
            power_state = self.cli_api.cli_get_power_state()
            if re.search('On', power_state[0], re.I):
                self.log_info(f"服务器已上电")
                break
            time.sleep(10)

        self.log_step("3、正常下电，查看服务器状态")
        poweroff = self.cli_api.cli_set_power_state('0')
        if poweroff == None:
            raise Exception("正常下电命令执行失败")
        for _ in range(try_times):
            power_state = self.cli_api.cli_get_power_state()
            if re.search('Off', power_state[0], re.I):
                self.log_info("服务器已关机")
                break
        else:
            raise Exception("当前电源状态不为关机状态，正常下电失败")

        self.log_step("4、恢复环境，服务器上电")
        self.cli_api.cli_set_power_state('1')
        try_times = 30
        for _ in range(try_times):
            power_state = self.cli_api.cli_get_power_state()
            if re.search('On', power_state[0], re.I):
                self.log_info(f"服务器已上电")
                break
            time.sleep(10)

    # 测试结束后恢复环境
    def post_test_case(self):
        pass